// import $router from '@/router'
import storage from 'utils/helper/storage'
// import calendar from '@/components/calendar'
// import openImageSwitcher from '@/components/imageViewer'
import cashierSDK from 'utils/cashier.sdk'
import ENV from 'utils/env'
import ua from 'utils/ua'
import {getFullUrl, checkLinkProtocol} from 'utils/helper/query'
import { isOutLink } from 'utils/helper/validator'
// import AJAX from 'utils/ajax'
// import {CHANNEL} from 'utils/config'


/**
 * 用于腾讯定位置服务api
 * doc: https://lbs.qq.com/service/webService/webServiceGuide/webServiceIp
 */
// const mapAjax = new AJAX({
// 	name: 'tx-map',
//   baseURL: 'https://apis.map.qq.com',
//   reponseMsgKey: 'message',
//   reponseCodeKey: 'status',
//   reponseSuccessCodes: [0] // 后台请求成功码
// })

export default {
  navigateTo(params) {
    if (isOutLink(params.url)){
      window.location.href = checkLinkProtocol(params.url)
      return
    }

    uni.navigateTo({
      ...params,
      fail() {
        window.location.href = getFullUrl(params.url)
      }
    })
  },
  redirectTo(params) {
    if (isOutLink(params.url)){
      window.location.href = checkLinkProtocol(params.url)
      return
    }

    uni.redirectTo({
      ...params,
      fail() {
        window.location.href = getFullUrl(params.url)
      }
    })
  },
  
  // openNewWebView({url}, type) {
  //   url = url.replace(location.origin, '')
  //   if (type == 'replace') {
  //     $router.replace({
  //       path: url
  //     })
  //   } else {
  //     $router.push({
  //       path: url
  //     })
  //   }
  // },

  redirectNewWebView(url) {
    window.location.replace(url)
  },

  gotoHomePage() {
    $router.push({
      path: '/'
    })
  },

  // closeWebView() {
  //   $router.back()
  // },

  clickRightBT() {},

  refreshPage() {},

  // openImageSwitcher(param) {
  //   openImageSwitcher({
  //     data: param
  //   })
  // },

  startTitleAnimation() {},

  // openCalendarVC(param) {
  //   let data = { maxDays: 45, ...param }
  //   return new Promise((resolve, reject) => {
  //     try {
  //       calendar({
  //         data: data,
  //         success: data => {
  //           if (data && data.result) {
  //             resolve(data.result)
  //           } else {
  //             reject(data)
  //           }
  //         }
  //       })
  //     } catch (err) {
  //       reject(err)
  //     }
  //   })
  //   // return new Promise((resolve, reject) => {
  //   //   let InDate = new Date(new Date(new Date().toLocaleDateString()).getTime())
  //   //   let OutDate = new Date(InDate.getTime() + 24 * 60 * 60 * 1000 * 2)
  //   //   resolve({
  //   //     checkInDate: Number(InDate),
  //   //     checkOutDate: Number(OutDate)
  //   //   })
  //   // })
  // },

  /**
	 * 腾讯位置服务获取定位城市
	 */
	// getLocation() {
  //   return new Promise((resolve, reject) => {
  //     console.log('----->准备定位')
  //     // TODO 要去后台配置域名ip白名单
  //     // 请求腾讯定位api
  //     let secretKey = 'qeP0fei98iYbNbHOpccNR68hjlfETWmD'
  //     let query = `/ws/location/v1/ip?key=BGDBZ-EKFWS-3MOO7-6BSXB-DY32J-57BDO`

  //     mapAjax.get(query).then(res => {
	// 			console.log('----->定位成功', res)
	// 			let { result={} } = res
	// 			let { ad_info, location } = result

	// 			let city = ad_info && ad_info.city

	// 			resolve({
	// 				latitude: location.lat,
	// 				longitude: location.lng,
	// 				city
	// 			})
	// 		}).catch(err => {
	// 			reject(err)
	// 		})
  //   })
	// },

  

  payOrderSDK(payParams) {
    payParams.env = ENV
    payParams.totalFee = payParams.totalAmount
    // payParams.versions = CHANNEL === 167 ? 'JJ' : 'BT'
    delete payParams.totalAmount
    delete payParams.biometricsSignData
    cashierSDK.setOptions(payParams)
  },

  callPhone(option = {}) {
    let phoneNumber = option.phoneNumber || ''
  
    let phoneLink = document.createElement('a')
  
    if (phoneNumber) {
      phoneLink.setAttribute('href', `tel:${phoneNumber}`)
      phoneLink.click()
    }
  },

  /**
	 * 获取节点offset值 （而非小程序提供的相对可视窗口的offset值）
	 * @param {string} selector 节点 与 select()方法一致
	 * @param {string} parent 节点相对滚动节点，非必传，不传以 viewport为默认值
	 * @param {string} context 查询上下文（页面/组件实例），含有自定义组件的页面，或者自定义组件中调用，必传
	 */
	getOffset(selector, parent, context) {
    let query = context ? context.createSelectorQuery() : uni.createSelectorQuery();

		let parentQuery = parent ? query.select(parent) : query.selectViewport()

		query.select(selector).boundingClientRect()
		parentQuery.scrollOffset()

		return new Promise((resolve, reject) => {
			query.exec(([selectRect, parentRect]) => {
				if (selectRect) {
					resolve({
						top: selectRect.top + parentRect.scrollTop,
						left: selectRect.left + parentRect.scrollLeft,
						height: selectRect.height,
            width: selectRect.width,
            bottom: selectRect.bottom
					})
				} else {
					console.warn(`[mp::getOffset]: 获取目标元素${selector}的offset信息失败`)
					resolve({
						top: 0,
						left: 0,
						height: 0,
						width: 0
					})
				}
			})
		})
	},

	/**
	 * 获取节点offset值 （而非小程序提供的相对可视窗口的offset值）
	 * @param {string} selector 节点 与 select()方法一致
	 * @param {string} parent 节点相对滚动节点，非必传，不传以 viewport为默认值
	 * @param {string} context 查询上下文（页面/组件实例），含有自定义组件的页面，或者自定义组件中调用，必传
	 */
	getAllOffset(selector, parent, context) {
    let query = context ? context.createSelectorQuery() : uni.createSelectorQuery();

    let parentQuery = parent ? query.select(parent) : query.selectViewport();
    
    query.selectAll(selector).boundingClientRect();
    parentQuery.scrollOffset();

    return new Promise((resolve, reject) => {
			query.exec(([selectRects, parentRect]) => {
        if (selectRects && selectRects.length) {
          resolve(selectRects.map(rect => {
            return {
              top: rect.top + parentRect.scrollTop,
              left: rect.left + parentRect.scrollLeft,
              height: rect.height,
              width: rect.width,
              rect     // 为了获取该select对象其他信息 如id
            };
          }));
        } else {
          console.warn(`[mp::getAllOffset]: 获取目标选择器${selector}的offset信息失败`)
					resolve([])
        }
			});
    });
  },
  
  /**
   * 设置选中城市信息
   * @param {*} data json对象，参考：https://wiki.bestwehotel.com/display/SalesofHotels/BTCityPlugin
   */
  selectCity(data) {
    return new Promise((resolve, reject) => {
      storage.set('__sdk__select_city', data)

      resolve()
    })
  },

  /**
   * 获取选中的城市
   */
  getSelectCity() {
    return new Promise((resolve, reject) => {
      let data = storage.get('__sdk__select_city')

      resolve(data)
    })
  },
  
  
	/**
	 * 获取安全区域高度(px)
	 */
	getSafeAreaHeight() {
    if (ua.isIphoneX) { // ios大屏
			return 34
		} else { // 安卓微信/锦江酒店app的h5和小程序窗口不包含安全区域，所以无需处理
      return 0
    }
  },
  
  /**
   * 获取自定义导航高度（弃用，因为小程序的选择器不支持子组件内节点查询，此处要和小程序保持一致）
   * 若要获取自定义导航高度，请在业务部分调用getOffset方法，在组件上包裹一层class
   */
  // getNavHeight() {
  //   let navOffest = this.getOffset('.uni-navbar')
  //   return navOffest.height
  // }
}
